home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Languages / Ms Fortran 7.7 / ENTX6L.ASM < prev    next >
Assembly Source File  |  1982-05-06  |  12KB  |  292 lines

  1. NAME    ENTX
  2.  
  3. ;  Microsoft MS-DOS Runtime System Control Source
  4. ;    Version 3.03 (C) Copyright 1982 by Microsoft, Inc
  5.  
  6. ;8086 Standard Runtime System Control
  7.  
  8. ;Memory Layout:
  9. ;
  10. ; Hi -> COMMAND (may be overlayed)
  11. ;               HIMEM  segment    class HIMEM (always empty)
  12. ;               <name> segment(s) class COMMON (not DGROUP)
  13. ;       DGROUP, COMMQQ segment    class COMMON
  14. ;       DGROUP, CONST  segment    class CONST
  15. ;       DGROUP, COMADS segment    class COMADS
  16. ;       DGROUP, DATA   segment    class DATA
  17. ;       DGROUP, STACK  segment    class STACK
  18. ;       DGROUP, MEMORY segment    class MEMORY
  19. ;       DGROUP, HEAP   segment    class MEMORY
  20. ;               CODE   segments
  21. ; Lo -> DOS code and data (fixed)
  22. ;
  23. ;The linker is told to load low and use DS allocation.  Only 256 bytes
  24. ;of initial stack are allocated, and no heap at all.  BEGXQQ moves all
  25. ;DGROUP to high memory, making a gap in which the stack grows downward
  26. ;and the heap grows upward.  The heap can grow downward over code too.
  27.  
  28. EXTRN   ENTGQQ:FAR             ;main program entry point
  29. EXTRN   INIX87:FAR,ENDX87:FAR  ;real number initialize/terminate
  30. EXTRN   INIUQQ:FAR,ENDUQQ:FAR  ;file system initialize/terminate
  31. EXTRN   ENDYQQ:FAR             ;file system close all open files
  32. EXTRN   BEGOQQ:FAR,ENDOQQ:FAR  ;user system initialize/terminate
  33.  
  34. ;First dummy code segment tells linker to load code lowest
  35. ;
  36. INIXQQ  SEGMENT 'CODE'
  37. INIXQQ  ENDS
  38.  
  39. ;Heap segment definition (lowest of the DGROUP segments)
  40. ;
  41. HEAP    SEGMENT PUBLIC 'MEMORY'
  42. MEMLO   EQU     THIS BYTE      ;lowest data byte address
  43. HEAP    ENDS
  44.  
  45. ;Memory segment definition (special purpose zero length)
  46. ;
  47. MEMORY  SEGMENT PUBLIC 'MEMORY'
  48. MEMORY  ENDS
  49.  
  50. ;Stack segment definition (fixed initial minimal length)
  51. ;
  52. STACK   SEGMENT STACK  'STACK'
  53.         DB      256 DUP (?)
  54. SKTOP   EQU     THIS BYTE
  55. STACK   ENDS
  56.  
  57. ;System resident public data
  58. ;
  59. DATA    SEGMENT PUBLIC 'DATA'
  60. PUBLIC  CSXEQQ                 ;pointer to sourcef context list
  61. CSXEQQ  DW      0
  62. PUBLIC  CLNEQQ                 ;last line number encountered
  63. CLNEQQ  DW      0
  64. PUBLIC  PNUXQQ                 ;pointer to unit initialization list
  65. PNUXQQ  DW      0
  66. PUBLIC  HDRFQQ                 ;Unit F open file list header
  67. HDRFQQ  DW      0
  68. PUBLIC  HDRVQQ                 ;Unit V open file list header
  69. HDRVQQ  DW      0
  70. PUBLIC  RESEQQ                 ;machine error context, stack ptr
  71. RESEQQ  DW      0
  72. PUBLIC  REFEQQ                 ;machine error context, frame ptr
  73. REFEQQ  DW      0
  74. PUBLIC  REPEQQ                 ;machine error context, program offset
  75. REPEQQ  DW      0
  76. PUBLIC  RECEQQ                 ;machine error context, program segment
  77. RECEQQ  DW      0
  78. PUBLIC  UPCX87                 ;offset address of 8087 error context
  79. UPCX87  DW      0
  80. PUBLIC  BEGHQQ                 ;first header word in heap
  81. BEGHQQ  DW      0
  82. PUBLIC  CURHQQ                 ;pointer to current heap item
  83. CURHQQ  DW      0
  84. PUBLIC  ENDHQQ                 ;just past end of the heap
  85. ENDHQQ  DW      0
  86. PUBLIC  STKBQQ                 ;stack start, to fix long GOTO
  87. STKBQQ  DW      0
  88. PUBLIC  STKHQQ                 ;stack limit, to check overflow
  89. STKHQQ  DW      0
  90. PUBLIC  BEGMQQ                 ;first group header in long heap
  91. BEGMQQ  DW      0
  92. PUBLIC  ENDMQQ                 ;segment past end of used memory
  93. ENDMQQ  DW      0
  94. PUBLIC  MAXMQQ                 ;segment past end of available memory
  95. MAXMQQ  DW      0
  96. PUBLIC  DGRMQQ                 ;segment of DGROUP
  97. DGRMQQ  DW      0
  98. PUBLIC  DOSEQQ                 ;DOS return code
  99. DOSEQQ  DW      0
  100. PUBLIC  CRCXQQ                 ;value of CX for DOS call
  101. CRCXQQ  DW      0
  102. PUBLIC  CRDXQQ                 ;value of DX for DOS call
  103. CRDXQQ  DW      0
  104. PUBLIC  CESXQQ                 ;DOS saved ES value (for command line)
  105. DOSOFF  DW      0
  106. CESXQQ  DW      0
  107. DATA    ENDS
  108.  
  109. ;Common address segment definition
  110. ;
  111. COMADS  SEGMENT PUBLIC 'COMADS'
  112. COMHI   EQU     THIS BYTE      ;highest comads address
  113. COMADS  ENDS
  114.  
  115. ;Constant segment definition
  116. ;
  117. CONST   SEGMENT PUBLIC 'CONST'
  118. CONST   ENDS
  119.  
  120. ;Blank common block segment
  121. ;
  122. COMMQQ  SEGMENT PUBLIC 'COMMON'
  123. COMMQQ  ENDS
  124.  
  125. ;End of memory segment definition
  126. ;
  127. HIMEM   SEGMENT PUBLIC 'HIMEM'
  128. HIMEM   ENDS
  129.  
  130. ;Code for this module
  131. ;
  132. ENTXQQ  SEGMENT 'CODE'
  133. DGROUP  GROUP   DATA,STACK,CONST,HEAP,MEMORY,COMADS,COMMQQ
  134.         ASSUME  CS:ENTXQQ,DS:DGROUP,ES:DGROUP,SS:DGROUP
  135.  
  136. PUBLIC  BEGXQQ,ENDXQQ,DOSXQQ   ;main entry and exit points
  137.  
  138. ; Start with error routine invoked if not enough memory
  139. MSGERR  DB      'Not Enough Memory$'
  140. EXIERR  DW      0
  141. EXSERR  DW      0
  142. MEMERR  LABEL   NEAR
  143.         PUSH    CS             ;message segment
  144.         POP     DS             ;parameter to DOS
  145.         MOV     DX,OFFSET ENTXQQ:MSGERR
  146.         MOV     AH,9           ;command, type string
  147.         INT     33             ;go give error message
  148.         MOV     EXSERR,ES      ;terminate segment
  149.         JMP     DWORD PTR EXIERR ;exit to DOS
  150.  
  151. ;BEGXQQ:  Initialization code
  152. ; - move DGROUP up as much as possible to get gap
  153. ; - set initial stackpointer, framepointer, STKBQQ
  154. ; - set BEGHQQ, CURHQQ, ENDHQQ, STKHQQ (heap init)
  155. ; - clear RESEQQ (machine error context)
  156. ; - clear CSXEQQ (sourcef error context)
  157. ; - clear PNUXQQ (unit init list header)
  158. ; - clear HDRFQQ and HDRVQQ (open file headers)
  159. ; - clear DOSEQQ (DOS error return code)
  160. ; - call  INIX87 (real initialization)
  161. ; - call  INIUQQ (file initialization)
  162. ; - call  BEGOQQ (user initialization)
  163. ; - call  ENTGQQ (main program entry)
  164. ;
  165. BEGXQQ  PROC    FAR
  166.         MOV     DX,OFFSET DGROUP:MEMLO ;DS offset to lowest byte
  167.         SHR     DX,1           ;make into word offset address
  168.         MOV     CX,32768       ;highest word address possible
  169.         SUB     CX,DX          ;CX is count of words in DGROUP segment
  170.         SHR     DX,1           ;make word
  171.         SHR     DX,1           ;  count into
  172.         SHR     DX,1           ;    paragraph count
  173.         INC     DX             ;round;  number of para's could use
  174.         MOV     AX,ES:2        ;DOS end paragraph (first segment not free)
  175.         MOV     BP,AX          ;(save for later long heap initialization)
  176.         SUB     AX,HIMEM       ;this is number of para's available total
  177.         JB      MEMERR         ;if negative amount available, error
  178.         XOR     BX,BX          ;assume all para's in DGROUP can be used
  179.         SUB     AX,DX          ;if positive, more available than can use
  180.         JAE     MEMA           ;if negative, minus number of para's unused
  181.         SUB     BX,AX          ;BX is number of para's unused in DGROUP
  182. MEMA:   SUB     DX,BX          ;DX is number of para's to move DGROUP
  183. ;
  184. ;save incomming ES value, fixup addresses of named common
  185.         MOV     AX,DGROUP      ;get assumed DGROUP segment value
  186.         MOV     DS,AX          ;this is the old, source segment
  187.         MOV     CESXQQ,ES      ;save incomming ES value in DS
  188.         MOV     SI,COMADS      ;first common segment address
  189.         SUB     SI,AX          ;make into paragraph offset
  190.         SHL     SI,1           ;make
  191.         SHL     SI,1           ;  into
  192.         SHL     SI,1           ;    byte
  193.         SHL     SI,1           ;      offset
  194. COMA:   CMP     SI,OFFSET DGROUP:COMHI ;last+ common address offset
  195.         JAE     CAMA           ;jump out if all addresses are fixed
  196.         ADD     2[SI],DX       ;fix segment part of address
  197.         ADD     SI,4           ;to next common segment+offset address
  198.         JMP     COMA           ;repeat
  199. ;
  200. ;move all of DGROUP higher in memory, making room for stack and heap
  201. CAMA:   ADD     DX,AX          ;old segment plus para's used
  202.         MOV     ES,DX          ;makes new, target segment
  203.         MOV     SI,65534       ;source offset
  204.         MOV     DI,SI          ;target offset
  205.         STD                    ;set direction flag
  206.         REP     MOVSW          ;move DS:SI-- to ES:DI-- until CX-=0
  207.         CLD                    ;leave direction clear
  208.         MOV     DS,DX          ;final DS value (may be negative)
  209. ;
  210. ;initialize stack segment and pointer
  211.         CLI                    ;no interrupts (no stack)
  212.         MOV     SS,DX          ;initialize stack segment
  213.         MOV     SP,OFFSET DGROUP:SKTOP ;set stackpointer
  214.         STI                    ;interrupts ok (stack ok)
  215.         MOV     STKBQQ,SP      ;to re-init BP after long GOTO
  216.         SUB     STKBQQ,6       ;contains address of main frame
  217. ;
  218. ;initialize short heap control addresses
  219.         SHL     BX,1           ;make count of
  220.         SHL     BX,1           ;  unused paragraphs
  221.         SHL     BX,1           ;    into DS offset to
  222.         SHL     BX,1           ;      first data byte
  223.         MOV     BEGHQQ,BX      ;start of heap DS offset
  224.         MOV     CURHQQ,BX      ;current heap item DS offset
  225.         MOV     WORD PTR[BX],1 ;current header;  free
  226.         ADD     BX,2           ;byte after end of heap
  227.         MOV     ENDHQQ,BX      ;DS offset after end of heap
  228.         ADD     BX,384         ;comfortable boundary
  229.         MOV     STKHQQ,BX      ;stack overflow DS offset
  230. ;
  231. ;initialize long heap control addresses
  232.         MOV     DGRMQQ,DX      ;DGROUP segment
  233.         SUB     DX,DGROUP      ;number of paragraphs shifted
  234.         ADD     DX,HIMEM       ;plus old end of used memory segment
  235.         MOV     ENDMQQ,DX      ;segment past end of used memory
  236.         MOV     MAXMQQ,BP      ;segment past end of all memory (from above)
  237.         XOR     BP,BP          ;get a zero (also initial framepointer)
  238.         MOV     BEGMQQ,BP      ;initial long heap group header
  239. ;
  240. ;initialize various list headers
  241.         MOV     RESEQQ,BP      ;machine error context zero
  242.         MOV     CSXEQQ,BP      ;sourcef error context NIL
  243.         MOV     PNUXQQ,BP      ;unit init list header NIL
  244.         MOV     HDRFQQ,BP      ;Unit F open file header NIL
  245.         MOV     HDRVQQ,BP      ;Unit V open file header NIL
  246.         MOV     DOSEQQ,BP      ;DOS error return value
  247. ;
  248. ;call real, file, and user initialization, call main program
  249.         CALL    INIX87         ;call real number initialization
  250.         CALL    INIUQQ         ;initialize file system
  251.         CALL    BEGOQQ         ;initialize user system
  252.         CALL    ENTGQQ         ;call main program
  253. ;
  254. ;ENDXQQ:  Termination code
  255. ; - call  ENDOQQ (user termination)
  256. ; - call  ENDYQQ (close open files)
  257. ; - call  ENDUQQ (file termination)
  258. ; - call  ENDX87 (real termination)
  259. ; - return to operating system
  260. ;
  261. ENDXQQ  LABEL   FAR            ;termination entry point
  262.         CALL    ENDOQQ         ;user system termination
  263.         CALL    ENDYQQ         ;close all open files
  264.         CALL    ENDUQQ         ;file system termination
  265.         CALL    ENDX87         ;real system termination
  266.         MOV     DOSOFF,0       ;make sure jump offset zero
  267.         JMP     DWORD PTR DOSOFF ;return to DOS
  268. BEGXQQ  ENDP
  269.  
  270. ;DOSXQQ:  Call DOS Operating System
  271. ;
  272. DOSXQQ  PROC    FAR
  273.         POP     SI             ;get return ads
  274.         POP     DI             ;get return ads
  275.         POP     DX             ;get address parameter
  276.         POP     AX             ;get function parameter
  277.         MOV     AH,AL          ;must be in high half
  278.         MOV     CX,CRCXQQ      ;need CX for some functions
  279.         PUSH    DI             ;save return ads
  280.         PUSH    SI             ;save return ads
  281.         PUSH    BP             ;have to save this one
  282.         INT     33             ;onward to DOS
  283.         MOV     CRCXQQ,CX      ;return CX value
  284.         MOV     CRDXQQ,DX      ;return DX value
  285.         POP     BP             ;restore frame pointer
  286.         RET                    ;return (DOS ret in AX)
  287. DOSXQQ  ENDP
  288.  
  289. ENTXQQ  ENDS
  290.  
  291.         END     BEGXQQ